home *** CD-ROM | disk | FTP | other *** search
/ Pascal Super Library / Pascal Super Library (CW International)(1997).bin / SWAG / SWAGA_C / COMM.SWG / 0087_Comm Program.pas < prev    next >
Pascal/Delphi Source File  |  1995-05-26  |  14KB  |  679 lines

  1. {
  2. From: russell@alpha3.ersys.edmonton.ab.ca (Russell Schulz)
  3.  
  4. using my tpserio from simtel and genericf from rnr123 on simtel:
  5. }
  6.  
  7. program uushell;  { accept a login and shell to uucico }
  8.  
  9. {
  10. Russell Schulz - russell@alpha3.ersys.edmonton.ab.ca (940423)
  11.  
  12. Copyright 1994 Russell Schulz
  13.  
  14. this code is not in the Public Domain
  15.  
  16. permission is granted to use these routines in any application regardless
  17. of commercial status as long as the author of these routines assumes no
  18. liability for any damages whatsoever for any reason.  have fun.
  19. }
  20.  
  21. {$M 16384,65536,65536}
  22.  
  23. {$define consoleoverride}
  24. {$undef consoleoverride}
  25.  
  26. {$define autoanswer}
  27. {$undef autoanswer}
  28.  
  29. uses dos,crt,genericf;
  30.  
  31. const
  32.   version='v0.2';
  33.   defaultidpwfn='c:\etc\idpw';
  34.   defaultmsg='Authorized use only -- all others disconnect now';
  35.   defaultuucicocmd='uucico.exe';
  36.   defaultuucicoparams='-r_0_-u%A';
  37.  
  38. var
  39.   console: boolean;
  40.   port: integer;
  41.   shadow: integer;
  42.   eightbitclean: boolean;
  43.   highcolor: integer;
  44.   lowcolor: integer;
  45.   readlnecho: boolean;
  46.   idleminutes: integer;
  47.   minstart: integer;
  48.   minlastinput: integer;
  49.   minutestorun: integer;
  50.   didtimeout: boolean;
  51.  
  52.   speed: longint;
  53.   delaytime: integer;
  54.  
  55.   idpwfn: string;
  56.   msg: string;
  57.   msgfn: string;
  58.  
  59.   uucicocmd: string;
  60.   uucicoparams: string;
  61.  
  62.   verbose: boolean;
  63.  
  64. {$undef debug}
  65. {$define debug}
  66.  
  67. {$undef timeout}
  68. {$define timeout}
  69.  
  70. {$undef timeoutreturnscr}
  71. {$define timeoutreturnscr}
  72.  
  73. {$i serio.pas}
  74.  
  75. procedure usage;
  76.  
  77. begin
  78.   writeln('uushell [-?] [-p port] [-s speed] [-d delaytime]');
  79.   writeln('  [-f file] [-m messagefile] [-c command] [-a arguments]');
  80.   writeln('  [-v]');
  81.   writeln;
  82.   writeln('  -p 0=COM1, 1=COM2');
  83.   writeln('  -s 2400=2400, 9600=9600');
  84.   writeln('  -d delay delaytime/1000 seconds');
  85.   writeln('  -f file of id-space-password, one set per line');
  86.   writeln('  -m first line of this file will be shown to callers');
  87.   writeln('  -c command (default: ',defaultuucicocmd,')');
  88.   writeln('     the extension is necessary.  if no path is given,');
  89.   writeln('     the PATH environment variable will be searched');
  90.   writeln('  -a arguments (default: ',defaultuucicoparams,')');
  91.   writeln('     underscores (_) will be changed to spaces');
  92.   writeln('     %A will be changed to the id');
  93.   writeln('  -v verbose');
  94.   writeln;
  95.   writeln('russell@alpha3.ersys.edmonton.ab.ca (941106)');
  96.   halt(1);
  97. end;
  98.  
  99. procedure execp(cmd,cmdline: string);
  100.  
  101. var
  102.   path: string;
  103.   success: boolean;
  104.   ncmd: string;
  105.   nbase: string;
  106.   npath: string;
  107.   el: string;
  108.   at: integer;
  109.  
  110. function indir(cmd,dir: string): boolean;
  111.  
  112. var
  113.   fileinfo: searchrec;
  114.  
  115. begin
  116.   findfirst(dir+'\'+cmd,archive,fileinfo);
  117.   indir := (doserror=0);
  118. end;
  119.  
  120. begin
  121.   success := false;
  122.  
  123.   ncmd := crepl(cmd,'/','\');
  124.   nbase := ncmd;
  125.  
  126. {strip path from nbase}
  127.  
  128.   repeat
  129.     at := pos(':',nbase);
  130.     if at<>0 then
  131.       nbase := copy(nbase,at+1,255);
  132.   until at=0;
  133.  
  134.   repeat
  135.     at := pos('\',nbase);
  136.     if at<>0 then
  137.       nbase := copy(nbase,at+1,255);
  138.   until at=0;
  139.  
  140. {chop off path.  if trailing \, chop, unless root or drive:root (then add .)}
  141.  
  142.   npath := '';
  143.   if nbase<>ncmd then
  144.     begin
  145.       success := true;  {so as to not look further than given path}
  146.       npath := copy(ncmd,1,length(ncmd)-length(nbase));
  147.       if npath='\' then
  148.         npath := npath+'.';
  149.       if pos(':\',npath)<>0 then
  150.         if copy(npath,length(npath)-1,2)=':\' then
  151.           npath := npath+'.';
  152.       if copy(npath,length(npath),1)='\' then
  153.         npath := copy(npath,1,length(npath)-1);
  154.     end;
  155.  
  156. {if an explicit path, use it -- otherwise, just try '.'}
  157.  
  158.   if npath='' then
  159.     npath := '.';
  160.  
  161. {if no extension, try com then exe}
  162.  
  163.   if pos('.',nbase)=0 then
  164.     begin
  165.       if indir(nbase+'.com',npath) then
  166.         begin
  167.           success := true;
  168.           exec(npath+'\'+nbase+'.com',cmdline);
  169.         end
  170.       else if indir(nbase+'.exe',npath) then
  171.         begin
  172.           success := true;
  173.           exec(npath+'\'+nbase+'.exe',cmdline);
  174.         end
  175.     end
  176.   else if indir(nbase,npath) then
  177.     begin
  178.       success := true;
  179.       exec(npath+'\'+nbase,cmdline);
  180.     end;
  181.  
  182.   if not success then
  183.     begin
  184.  
  185. {not found in explicit path (or ., if no explicit path).  try $PATH}
  186.  
  187.       path := getenv('PATH');
  188.       while not success and (path<>'') do
  189.         begin
  190.           if copy(path,length(path),255)<>';' then
  191.             path := path+';';
  192.           at := pos(';',path);
  193.           el := copy(path,1,at-1);
  194.           path := copy(path,at+1,255);
  195.           if pos('.',nbase)=0 then
  196.             begin
  197.               if indir(nbase+'.com',el) then
  198.                 begin
  199.                   success := true;
  200.                   exec(el+'\'+nbase+'.com',cmdline);
  201.                 end
  202.               else if indir(nbase+'.exe',el) then
  203.                 begin
  204.                   success := true;
  205.                   exec(el+'\'+nbase+'.exe',cmdline);
  206.                 end;
  207.             end
  208.           else
  209.             begin
  210.               if indir(nbase,el) then
  211.                 begin
  212.                   success := true;
  213.                   exec(el+'\'+nbase,cmdline);
  214.                 end;
  215.             end;
  216.         end;
  217.     end;
  218. end;
  219.  
  220. procedure sendch(c: char);
  221.  
  222. begin
  223.   xwrites(c);
  224.   if xkeypressed then
  225.     write(xreadkey);
  226.   if xkeypressed then
  227.     write(xreadkey);
  228.   if xkeypressed then
  229.     write(xreadkey);
  230.   if xkeypressed then
  231.     write(xreadkey);
  232.   if xkeypressed then
  233.     write(xreadkey);
  234.   delay(50);
  235. end;
  236.  
  237. procedure outstrnocr(s: string);
  238.  
  239. var
  240.   i: integer;
  241.   echo: string;
  242.   anecho: boolean;
  243.  
  244. begin
  245.   if verbose then
  246.     begin
  247.       writeln('writing: ',s);
  248.       writeln;
  249.     end;
  250.  
  251.   echo := '';
  252.   for i := 1 to length(s) do
  253.     begin
  254.       xwrites(s[i]);
  255.  
  256.       if s[i]<>#13 then
  257.         delay(4*delaytime);
  258.  
  259.       delay(delaytime);
  260.       repeat
  261.         anecho := xkeypressed;
  262.         if anecho then
  263.           echo := echo+xreadkey;
  264.         delay(delaytime);
  265.       until not anecho;
  266.     end;
  267.  
  268.   if verbose then
  269.     if echo<>'' then
  270.       writeln('echo: ',echo);
  271. end;
  272.  
  273. procedure outstr(s: string);
  274.  
  275. begin
  276.   outstrnocr(s+#13);
  277. end;
  278.  
  279. procedure initmsg;
  280.  
  281. var
  282.   msgf: text;
  283.  
  284. begin
  285.   msg := defaultmsg;
  286.  
  287.   if msgfn<>'' then
  288.     begin
  289.       assign(msgf,msgfn);
  290.       {$I-}
  291.       reset(msgf);
  292.       {$I+}
  293.       if ioresult<>0 then
  294.         begin
  295.           writeln('! could not open message file ',msgfn);
  296.           writeln('! using default message');
  297.         end
  298.       else
  299.         begin
  300.           if not eof(msgf) then
  301.             readln(msgf,msg);
  302.           close(msgf);
  303.         end;
  304.     end;
  305. end;
  306.  
  307. procedure initialize;
  308.  
  309. var
  310.   i: integer;
  311.   code: word;
  312.   s: string;
  313.  
  314. begin
  315.   speed := 2400;
  316.   port := 0;
  317.   delaytime := 500;
  318.   idpwfn := defaultidpwfn;
  319.   msgfn := '';
  320.   uucicocmd := defaultuucicocmd;
  321.   uucicoparams := defaultuucicoparams;
  322.   verbose := false;
  323.  
  324. {$ifdef com2}
  325.   port := 1;
  326. {$endif}
  327.  
  328.   i := 1;
  329.   while i<=paramcount do
  330.     begin
  331.       if paramstr(i)='-p' then
  332.         begin
  333.           inc(i);
  334.           if i<=paramcount then
  335.             val(paramstr(i),port,code)
  336.           else
  337.             usage;
  338.         end
  339.       else if paramstr(i)='-s' then
  340.         begin
  341.           inc(i);
  342.           if i<=paramcount then
  343.             val(paramstr(i),speed,code)
  344.           else
  345.             usage;
  346.         end
  347.       else if paramstr(i)='-d' then
  348.         begin
  349.           inc(i);
  350.           if i<=paramcount then
  351.             val(paramstr(i),delaytime,code)
  352.           else
  353.             usage;
  354.         end
  355.       else if paramstr(i)='-f' then
  356.         begin
  357.           inc(i);
  358.           if i<=paramcount then
  359.             idpwfn := paramstr(i)
  360.           else
  361.             usage;
  362.         end
  363.       else if paramstr(i)='-m' then
  364.         begin
  365.           inc(i);
  366.           if i<=paramcount then
  367.             msgfn := paramstr(i)
  368.           else
  369.             usage;
  370.         end
  371.       else if paramstr(i)='-c' then
  372.         begin
  373.           inc(i);
  374.           if i<=paramcount then
  375.             uucicocmd := paramstr(i)
  376.           else
  377.             usage;
  378.         end
  379.       else if paramstr(i)='-a' then
  380.         begin
  381.           inc(i);
  382.           if i<=paramcount then
  383.             uucicoparams := paramstr(i)
  384.           else
  385.             usage;
  386.         end
  387.       else if paramstr(i)='-v' then
  388.         begin
  389.           verbose := true;
  390.         end
  391.       else
  392.         usage;
  393.       inc(i);
  394.     end;
  395.  
  396.   portengage;
  397.   portspeed(speed);
  398.   console := false;
  399.  
  400.   shadow := 0;
  401.  
  402.   if verbose then
  403.     shadow := 1;
  404.  
  405.   outstr('ATV1E1');
  406.  
  407.   initmsg;
  408. end;
  409.  
  410. procedure initmodem;
  411.  
  412. var
  413.   s: string;
  414.  
  415. begin
  416.  
  417.   writeln('Initializing modem...');
  418.  
  419.   delay(1000);
  420.  
  421.   outstr('AT');
  422.   outstr('ATZ');
  423.   outstr('AT');
  424.  
  425. {$ifdef autoanswer}
  426.   outstr('ATS0=1');
  427. {$endif}
  428.  
  429. end;
  430.  
  431. procedure shutdown;
  432.  
  433. var
  434.   s: string;
  435.  
  436. begin
  437.   writeln('Restoring modem settings...');
  438.  
  439.   outstr('AT');
  440.   outstr('AT');
  441.   outstr('ATS0=0');
  442.   outstr('AT');
  443.   outstr('AT');
  444.  
  445.   portdisengage;
  446. end;
  447.  
  448. procedure hangup;
  449.  
  450. begin
  451.   delay(2000);
  452.   outstrnocr('+++');
  453.   delay(2000);
  454.  
  455.   outstr('AT');
  456.   outstr('ATH');
  457. end;
  458.  
  459. function verify(id,pw: string): boolean;
  460.  
  461. var
  462.   result: boolean;
  463.   s: string;
  464.   idpwf: text;
  465.   i: integer;
  466.  
  467. begin
  468.   result := false;
  469.  
  470.   assign(idpwf,idpwfn);
  471.  
  472. {$I-}
  473.   reset(idpwf);
  474. {$I+}
  475.   if ioresult<>0 then
  476.     begin
  477.       writeln('! could not open id+password file ',idpwfn);
  478.       writeln('! no logins will succeed');
  479.     end
  480.   else
  481.     begin
  482.       while not eof(idpwf) do
  483.         begin
  484.           readln(idpwf,s);
  485.           if chopfirstw(s)=id then
  486.             if s=pw then
  487.               result := true;
  488.         end;
  489.       close(idpwf);
  490.     end;
  491.  
  492.   verify := result;
  493. end;
  494.  
  495. function expandparams(oldparams: string; id: string): string;
  496.  
  497. var
  498.   result: string;
  499.  
  500. begin
  501.   result := ununderscore(oldparams);
  502.  
  503.   result := srepl(result,'%A',id);
  504.  
  505.   expandparams := result;
  506. end;
  507.  
  508. procedure getlogin;
  509.  
  510. var
  511.   expandedparams: string;
  512.   id: string;
  513.   pw: string;
  514.  
  515. begin
  516.   console := false;
  517.   shadow := 1;
  518.   xwriteln;
  519.   xwritelns('authorized use only.');
  520.   xwriteln;
  521.   xwrites('login: ');
  522.   readlnecho := true;
  523.   xreadlns(id,80,false);
  524.   xwriteln;
  525.   xwrites('password: ');
  526.   readlnecho := false;
  527.   xreadlns(pw,80,false);
  528.   xwriteln;
  529.  
  530.   if verbose then
  531.     writeln('id: ',id,' pw: ',pw);
  532.  
  533.   if not verify(id,pw) then
  534.     begin
  535.       xwriteln;
  536.       xwritelns('sorry');
  537.     end
  538.   else
  539.     begin
  540.       writeln('disengaging communications port...');
  541.       portdisengage;
  542.       writeln('running uucico for ',id);
  543.       expandedparams := expandparams(uucicoparams,id);
  544.       writeln(uucicocmd,' ',expandedparams);
  545.       execp(uucicocmd,expandedparams);
  546.       writeln('engaging communications port...');
  547.       portengage;
  548.       portspeed(speed);
  549.     end;
  550.  
  551.   if not verbose then
  552.     shadow := 0;
  553.  
  554. end;
  555.  
  556. procedure getcalls;
  557.  
  558. var
  559.   done: boolean;
  560.   ch: char;
  561.   str: string;
  562.   currmitoday: integer;
  563.  
  564. begin
  565.   write('Waiting for call...');
  566.   currmitoday := mitoday;
  567.  
  568.   done := false;
  569.   str := '';
  570.   while not done do
  571.     begin
  572.  
  573.       minlastinput := mitoday;
  574.  
  575.       if currmitoday<>mitoday then
  576.         begin
  577.           write('.');
  578.           currmitoday := mitoday;
  579.         end;
  580.  
  581.       console := true;
  582.       if keypressed then
  583.         begin
  584.           ch := readkey;
  585.  
  586.           if verbose then
  587.             writeln(ch);
  588.  
  589.           if ch='q' then
  590.             begin
  591.               done := true;
  592.               writeln;
  593.               writeln('Quit...');
  594.             end
  595.           else if ch='a' then
  596.             begin
  597.               write('Answering...');
  598.               outstr('ATA');
  599.             end
  600.           else if ch='p' then
  601.             begin
  602.               write('Pausing...');
  603.               ch := readkey;
  604.               write('Waiting...');
  605.             end
  606.           else
  607.             begin
  608.               writeln;
  609.               if (ord(ch)<32) or (ord(ch)>126) then
  610.                 writeln('unknown key ',ord(ch))
  611.               else
  612.                 writeln('unknown key ',ch);
  613.             end;
  614.         end;
  615.  
  616.       console := false;
  617.       if xkeypressed then
  618.         begin
  619.           ch := xreadkey;
  620.  
  621.           if verbose then
  622.             writeln(ch);
  623.  
  624.           if (ch<>#13) and (ch<>#10) then
  625.             str := str+ch
  626.           else
  627.             begin
  628.               if verbose then
  629.                 writeln('got: ',str);
  630.  
  631.               if str='RING' then
  632.                 begin
  633.                   write('Ring...');
  634. {$ifndef autoanswer}
  635.                   outstr('ATA');
  636. {$endif}
  637.                 end;
  638.               if copy(str,1,7)='CONNECT' then
  639.                 begin
  640.                   writeln;
  641.                   writeln('Connected at: ',str);
  642.                   minlastinput := mitoday;
  643.                   getlogin;
  644.                   minlastinput := mitoday;
  645.                   hangup;
  646.                   initmodem;
  647.                   write('Waiting for call...');
  648.                 end;
  649.               str := '';
  650.             end;
  651.         end;
  652.     end;
  653.  
  654.   writeln;
  655. end;
  656.  
  657. begin
  658.   writeln('uushell ',version);
  659.   writeln;
  660.  
  661.   console := true;
  662.   port := 0;
  663.   shadow := 0;
  664.   eightbitclean := true;
  665.   highcolor := 0;
  666.   lowcolor := 0;
  667.   idleminutes := 2;
  668.   minutestorun := -1;
  669.   didtimeout := false;
  670.  
  671.   minstart := mitoday;
  672.   minlastinput := minstart;
  673.  
  674.   initialize;
  675.   initmodem;
  676.   getcalls;
  677.   shutdown;
  678. end.
  679.